/**
 * 时间格式化函数
 * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 *
 * @param {Date||number} date Date对象或者时间戳
 * @param {string} fmt 格式化字符串
 *        ("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
 *        ("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
 * @returns {string} 格式化后的字符串
 */
module.exports = {
  format: function(date, fmt = "yyyy-MM-dd hh:mm:ss") {
    if (!date) return "";
    // 如果是时间戳的话那么转换成Date类型
    const dateType = typeof date;
    switch (dateType) {
      case "number": {
        date = new Date(date);
        break;
      }
      case "string": {
        date = new Date(date);
        break;
      }
      default: {
        console.warn(
          "时间类型可能存在错误，期望的是【string、number】，给的类型是【",
          dateType,
          "】, date -> " + date
        );
        break;
      }
    }

    const o = {
      // 月份
      "M+": date.getMonth() + 1,
      // 日
      "d+": date.getDate(),
      // 小时
      "h+": date.getHours(),
      // 分
      "m+": date.getMinutes(),
      // 秒
      "s+": date.getSeconds(),
      // 季度
      "q+": Math.floor((date.getMonth() + 3) / 3),
      // 毫秒
      S: date.getMilliseconds()
    };
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        (date.getFullYear() + "").substr(4 - RegExp.$1.length)
      );
    }
    for (const k in o) {
      if (new RegExp("(" + k + ")").test(fmt)) {
        fmt = fmt.replace(
          RegExp.$1,
          RegExp.$1.length === 1
            ? o[k]
            : ("00" + o[k]).substr(("" + o[k]).length)
        );
      }
    }
    return fmt;
  },
  getIntegerTimes(date = new Date(), interval = "day") {
    date = new Date(date);
    const intervalMap = getInterval();
    interval = intervalMap[interval.toLowerCase()];
    const intervals = Object.values(intervalMap);
    let toDate = "";
    intervals.some((timeField, index) => {
      toDate +=
        index === 1 ? date[`get${timeField}`]() + 1 : date[`get${timeField}`]();
      if (index < 2) {
        toDate += "/";
      } else if (index === 2) {
        toDate += " ";
      } else if (index > 2 && index <= 5) {
        toDate += ":";
      }
      return timeField === interval;
    });
    return new Date(toDate);

    function getInterval() {
      return {
        year: "FullYear",
        month: "Month",
        day: "Date",
        hour: "Hours",
        minute: "Minutes",
        second: "Seconds"
      };
    }
  }
};
